/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pkgUtil.pkgSupportFile.pkgFrameworkFile;

import java.io.IOException;
import java.io.RandomAccessFile;

public class Register implements IGrabable {

    
    private IGrabable datos;    // los datos puros que serán grabados

    /**
     * Crea un Registro sin datos, marcándolo como activo
     */
    public Register() {
    }

    /**
     * Crea un Registro con datos, marcándolo como activo
     */
    public Register(IGrabable d) {
        datos = d;
    }

    /**
     * Cambia los datos del registro en memoria
     *
     * @param d los nuevos datos
     */
    public void setData(IGrabable d) {
        datos = d;
    }

    /**
     * Accede a los datos del registro en memoria
     *
     * @return una referencia a los datos del registro
     */
    public IGrabable getData() {
        return datos;
    }

    /**
     * Calcula el tamaño en bytes del objeto, tal como será grabado en disco.
     * Pedido por Grabable.
     *
     * @return el tamaño en bytes del objeto como será grabado.
     */
    @Override
    public int sizeOf() {
        //return datos.sizeOf() + 1;   // suma 1 por el atributo "activo", que es boolean
        return datos.sizeOf();
    }

    /**
     * Especifica cómo se graba un Register en disco. Pedido por Grabable.
     *
     * @param a el manejador del archivo de disco donde se hará la grabación
     */
    @Override
    public void save(RandomAccessFile a) throws IOException {
        datos.save(a);
    }

    /**
     * Especifica cómo se lee un Register desde disco. Pedido por Grabable.
     *
     * @param a el manejador del archivo de disco desde donde se hará la lectura
     */
    @Override
    public void read(RandomAccessFile a) throws IOException {
        datos.read(a);
    }

    /**
     * Lee desde un archivo un String de "tam" caracteres. Se declara static
     * para que pueda ser usado en forma global por cualquier clase que requiera
     * leer una cadena de longitud fija desde un archivo.
     *
     * @param arch el archivo desde el cual se lee
     * @param tam la cantidad de caracteres a leer
     * @return el String leido
     */
    public static final String readString(RandomAccessFile arch, int tam) throws IOException {
        String cad = "";


        char vector[] = new char[tam];
        for (int i = 0; i < tam; i++) {
            vector[i] = arch.readChar();
        }
        cad = new String(vector, 0, tam);


        return cad;
    }

    /**
     * Graba en un archivo un String de "tam" caracteres. Se declara static para
     * que pueda ser usado forma en global por cualquier clase que requiera
     * grabar una cadena de longitud fija en un archivo.
     *
     * @param arch el archivo en el cual se graba
     * @param cad la cadena a a grabar
     * @param tam la cantidad de caracteres a grabar
     */
    public static final void writeString(RandomAccessFile arch, String cad, int tam) throws IOException {

        int i;
        char vector[] = new char[tam];
        for (i = 0; i < tam; i++) {
            vector[i] = ' ';
        }
        cad.getChars(0, cad.length(), vector, 0);
        for (i = 0; i < tam; i++) {
            arch.writeChar(vector[i]);
        }

    }

    /**
     * Compara dos objetos de la clase Register. Devuelve el resultado de
     * comparar los datos contenidos en el registro.
     *
     * @return 0 si los objetos eran iguales, 1 si el primero era mayor, -1 en
     * caso contrario
     * @param x el objeto contra el cual se compara.
     */
    @Override
    public int compareTo(Object x) {
        Register r = (Register) x;
        return datos.compareTo(r.datos);
    }

}
